import axios from 'axios'
import toast from 'react-hot-toast';
//设置axios的基础URL，也就是前半部分固定的地址，（既不是请求体（Request Body）也不是请求头（Request Headers））
axios.defaults.baseURL = 'http://localhost:3000'

//告诉服务器： 客户端发送的请求体数据格式为JSON 。当设置为 application/json 时：
// - Axios会自动将JavaScript对象序列化为JSON字符串
// - 服务器会按照JSON格式解析请求体数据
axios.defaults.headers.post['Content-Type'] = 'application/json'
//请求拦截器---所有请求都会先被这个拦截器拦截
axios.interceptors.request.use(request => {//request表示前端发送的请求数据
    const access_token = localStorage.getItem('access_token')//从浏览器本地获取token
    if (access_token) {//如果令牌(token)存在，将令牌(token)放到请求头中
        request.headers.Authorization = access_token//将令牌(token)放到请求头中
    }
    return request//返回请求数据(放行)
})

//响应拦截器
axios.interceptors.response.use(
    //http状态码为200时才进第一个回调函数
    (response) => {//response表示后端返回的数据
        if (response.status === 200) {
            if (response.data.code !== '1') {//逻辑性错误
                toast.error(response.data.msg)
                return Promise.reject(response)//返回一个失败的Promise对象，这样前端就可以在catch中处理异常情况
            }
            return Promise.resolve(response.data)//返回成功的Promise对象，这样前端就可以在then中处理成功情况
        }
    },
    //http状态码为不为2开头时才进第二个回调函数
    (res) => {
        //后端返回的短token过期的状态码为401
        if (res.status === 401) {
            const originalRequest = res.config//获取原始请求，将没有成功的原始请求记录下来
            //重新请求新的短token和长token
            const refresh_token = localStorage.getItem('refresh_token')//从浏览器本地获取token
                if(refresh_token){
                    axios.post('/user/refresh',{refresh_token}).then(res=>{
                        if(res.code==='1'){
                            localStorage.setItem('access_token',res.access_token)//将新的短token放到浏览器本地
                            localStorage.setItem('refresh_token',res.refresh_token)//将新的长token放到浏览器本地
                            //将原始请求的headers中的Authorization属性设置为新的短token
                            originalRequest.headers.Authorization = res.access_token
                            //重新发送原始请求
                            return axios(originalRequest)
                        }
                    })
                }
        }
        //如果长短token都过期了，后端返回的状态码为416
        if(res.status===416){
            toast.error(res.response.data.msg)
            setTimeout(() => {
                window.location.href = '/login'//使用原生js跳转方式，跳转到登录页
            }, 2000)
        }
        //如果短token不存在，后端返回的状态码为402
        if(res.status===402){
            toast.error(res.response.data.msg)
            setTimeout(() => {
                window.location.href = '/login'//使用原生js跳转方式，跳转到登录页
            }, 2000)
        }
    }
)
export default axios
